01.03.2022
0
4
236
100

Manuel açılmış pozisyonlara Bist ve Viop sembolleri için sentetik emir(Kar al, Zarar durdur, İzsürenstop) portföy penceresinden tanımlanırken kripto sembolleri için yapı gereği bu mümkün olmuyor.


Kripto sembolleri içinde bu strateji ile portföyde bulunan pozisyonlara sentetik emir tanımlanabilir.


Quantity değişkenini pozitif değer girip Long pozisyon için stop uygulanabildiği gibi negatif değer girip Short pozisyonlara stop uygulanabiir.


***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***


using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;

namespace Matriks.Lean.Algotrader
{
	public class KriptoSentetikEmir : MatriksAlgo
	{
		[SymbolParameter("BTC_USDT_BIN")]
		public string Symbol;

		[Parameter(1)]
		public decimal Quantity;

		[Parameter(true)]
		public bool KarAlKullan;
		
		[Parameter(oran.Yuzde)]
		public oran KarAlOranTipi;

		[Parameter(2)]
		public decimal KarALSeviyesi;		

		[Parameter(true)]
		public bool ZararDurdurKullan;
		
		[Parameter(oran.Yuzde)]
		public oran ZararDurdurOranTipi;

		[Parameter(2)]
		public decimal ZararDurdurSeviyesi;		

		[Parameter(true)]
		public bool IzSurenStopKullan;
		
		[Parameter(oran.Yuzde)]
		public oran IzSurenStopOranTipi;

		[Parameter(2)]
		public decimal IzSurenStopSeviyesi;		

		public enum oran
		{
			Yuzde, Puan
		}

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod.Year);
			SendOrderSequential(true, Side.All);
		}

		ISyntheticOrderPrices ka, zd, iz;

		[Output]
		public decimal sonFiyat;

		decimal adet = 0;
		bool bayrak = false;

		[Output]
		public decimal karAlLong;
		[Output]
		public decimal karALShort;

		[Output]
		public decimal zararDurdurLong;
		[Output]
		public decimal zararDurdurShort;

		[Output]
		public decimal izSurenStopLong;
		[Output]
		public decimal izSurenStopShort;

		[Output]
		public decimal TepeNoktasi = decimal.MinValue;

		public override void OnInitComplated()
		{
			var barDataModel = GetBarData();
			sonFiyat = Ref(barDataModel, OHLCType.Close, 0);
			SetAlgoPosition(Symbol, Quantity, sonFiyat);
			TepeNoktasi = sonFiyat;

			Debug("Strateji Başladı");
			Debug("Son Fiyat: " + sonFiyat);

			if (KarAlKullan && KarALSeviyesi != 0)
			{
				if (KarAlOranTipi == oran.Yuzde)
				{
					ka = TakeProfit(Symbol, SyntheticOrderPriceType.Percent, KarALSeviyesi);
				}else if (KarAlOranTipi == oran.Puan)
				{
					ka = TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, KarALSeviyesi);
				}
				adet += KarALSeviyesi;
				bayrak = true;
			}

			if (ZararDurdurKullan && ZararDurdurSeviyesi != 0)
			{
				if (ZararDurdurOranTipi == oran.Yuzde)
				{
					zd = StopLoss(Symbol, SyntheticOrderPriceType.Percent, ZararDurdurSeviyesi);
				}else if (ZararDurdurOranTipi == oran.Puan)
				{
					zd = StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, ZararDurdurSeviyesi);
				}
				adet += ZararDurdurSeviyesi;
				bayrak = true;
			}

			if (IzSurenStopKullan && IzSurenStopSeviyesi != 0)
			{
				if (IzSurenStopOranTipi == oran.Yuzde)
				{
					iz = TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, IzSurenStopSeviyesi);
				}else if (IzSurenStopOranTipi == oran.Puan)
				{
					iz = TrailingStopLoss(Symbol, SyntheticOrderPriceType.PricePoint, IzSurenStopSeviyesi);
				}
				adet += IzSurenStopSeviyesi;
				bayrak = true;
			}
		}

		public override void OnDataUpdate(BarDataCurrentValues bd)
		{
			if (bayrak && adet != 0)
			{
				sonFiyat = bd.LastUpdate.Close;
				TepeNoktasi = sonFiyat>TepeNoktasi? sonFiyat:TepeNoktasi;

				if (KarAlKullan && KarALSeviyesi != 0)
				{
					karAlLong = ka.LongPositionStopPrice;
					karALShort = ka.ShortPositionStopPrice;
				}

				if (ZararDurdurKullan && ZararDurdurSeviyesi != 0)
				{
					zararDurdurLong = zd.LongPositionStopPrice;
					zararDurdurShort = zd.ShortPositionStopPrice;
				}

				if (IzSurenStopKullan && IzSurenStopSeviyesi != 0)
				{
					izSurenStopLong = iz.LongPositionStopPrice;
					izSurenStopShort = iz.ShortPositionStopPrice;
				}
			}
		}

		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (sOrder.EnableOrderSending)
			{
				if (sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.TakeProfit)
				{
					Debug("Kar al tetiklendi");
				}else if (sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.StopLoss)
				{
					Debug("Zarar durdur tetiklendi");
				}else if (sOrder.SyntheticAlgoOrderType == SyntheticAlgoOrderType.TrailingStopLoss)
				{
					Debug("İzsürenstop tetiklendi");
				}

				Debug("Tepe Noktasi: " + TepeNoktasi);
				Debug("Son fiyat: " + sonFiyat);
				bayrak = false;
			}
		}

		// Gerekli - Timestamp
		public class OrderListTimestamp
		{
			public string ID;
			public string Sembol;
			public decimal Adet;
			public decimal Fiyat;
			public OrdType EmirTipi;
			public OrderSide orderSide;
			public string EmirYonu;
			public DateTime TetiklenmeZamani;
			public int Sayac;
			public bool AktifMI;
		}

		Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();

		[Parameter(3)]
		public int AyniEmirKacSeferGonderilsin;

		[Parameter(10)]
		public int KacSaniyeSonraTekrarGonderilsin;

		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				Debug("gerçekleşti");

				if (timestampDict.ContainsKey(order.CliOrdID))
				{
					timestampDict.Remove(order.CliOrdID);
					Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
				}
			}

			if (order.OrdStatus.Obj == OrdStatus.Rejected)
			{
				if (!timestampDict.ContainsKey(order.CliOrdID))
				{
					OrderListTimestamp orderList = new OrderListTimestamp();
					orderList.ID = order.CliOrdID;
					orderList.Sembol = order.Symbol;
					orderList.Adet = order.OrderQty;
					orderList.Fiyat = order.Price;
					orderList.EmirTipi = order.OrdType;
					orderList.TetiklenmeZamani = DateTime.Now;
					orderList.Sayac = 0;
					orderList.AktifMI = false;

					if (order.Side.Obj == Side.Buy)
					{
						orderList.orderSide = OrderSide.Buy;
						orderList.EmirYonu = "Alış";
					}else
					{
						orderList.orderSide = OrderSide.Sell;
						orderList.EmirYonu = "Satış";
					}

					timestampDict[order.CliOrdID] = orderList;
				}

				if (order.Text.Contains("Timestamp"))
				{
					if (timestampDict.ContainsKey(order.CliOrdID))
					{
						if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
						{
							timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
							timestampDict[order.CliOrdID].Sayac++;
							timestampDict[order.CliOrdID].AktifMI = true;

							Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
						}else
						{
							timestampDict.Remove(order.CliOrdID);
							Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");
						}
					}
				}
			}
		}


		string orderIDTimestamp = string.Empty;

		public override void OnTimer()
		{
			var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);

			if (tutt.Count() >0)
			{
				foreach (var deger in tutt)
				{
					LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;

					if (deger.Value.EmirTipi.Obj == OrdType.Limit)
					{
						orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
					{
						orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}

					deger.Value.ID = orderIDTimestamp;
					deger.Value.AktifMI = false;
					timestampDict[orderIDTimestamp] = deger.Value;
					timestampDict.Remove(deger.Key);

				}
			}
		}
		// #Gerekli - Timestamp
	}
}

0 Yorum